package model.dominio.listasSimples;

import java.io.IOException;

/**
 *
 * @author Gustavo Canul, Noe Cob, Arandi López
 */
public abstract class Lista {

    /**
     *
     */
    protected NodosLista primerNodo;
    /**
     *
     */
    protected NodosLista ultimoNodo;
    /**
     *
     */
    protected String nombre;

    /**
     *
     * @param nombre
     */
    public Lista(String nombre) {
        this.nombre = nombre;
        this.primerNodo = null;
        this.ultimoNodo = null;
    }

    /**
     *
     */
    public Lista() {
        this("Lista");
    }

    /**
     *
     * @return
     */
    public boolean esVacio() {
        return primerNodo == null;
    }

    /**
     *
     */
    public void imprimir() {

        if (esVacio()) {
            System.out.println("La lista esta vacia.");
        } else {
            System.out.println("La lista es: ");
            NodosLista actual = this.primerNodo;

            while (actual != null) {
                System.out.print("["+actual.obtenerDato().toString()  +actual.getLetra()+"]" + "-->");
                actual = actual.obtenerSiguiente();
            }

            System.out.println("");
        }
    }

    /**
     * Constructor que devuelve el primer nodo de la lista 
     * @return primerNodo
     */
    public NodosLista obtenerPrimerNodo() {
        return primerNodo;
    }

    /**
     * Contructor que inicializa el valor del primer nodo en la lista 
     * @param primerNodo
     */
    public void establecerPrimerNodo(NodosLista primerNodo) {
        this.primerNodo = primerNodo;
    }

    /**
     * Constructor que devuelve el ultimo nodo de la lista
     * @return ultimoNodo 
     */
    public NodosLista obtenerUltimoNodo() {
        return ultimoNodo;
    }

    /**
     * Constructor que inicializa el valor del ultimo nodo en la lista
     * @param ultimoNodo
     */
    public void establecerUltimoNodo(NodosLista ultimoNodo) {
        this.ultimoNodo = ultimoNodo;
    }

    /**
     * Constructor que devuelve el nombre de la lista
     * @return nombre
     */
    public String obtenerNombre() {
        return nombre;
    }

    /**
     * Constructor que pone el nombre a la lista
     * @param nombre
     */
    public void establecerNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     *
     * @param frecuencia
     * @param letra
     */
    public abstract void insertarFinal(Object frecuencia,char letra);

    /**
     *
     * @param frecuencia
     * @param letra
     */
    public abstract void insertarFrente(Object frecuencia,char letra);

    /**
     * Constructor que inserta la frecuencia y letra a la lista 
     * @param frecuencia
     * @param letra
     * @throws IOException
     */
    public abstract void insertarOrden(Object frecuencia,char letra) throws IOException;

    /**
     *
     * @return
     * @throws ExcepcionListaVacia
     */
    public abstract Object removerFrente() throws ExcepcionListaVacia;

    /**
     *
     * @return
     * @throws ExcepcionListaVacia
     */
    public abstract Object removerFinal() throws ExcepcionListaVacia;

    /**
     *
     * @param frecuencia
     * @param letra
     * @return
     * @throws ExcepcionListaVacia
     */
    public abstract Object removerObjeto(Object frecuencia,char letra) throws ExcepcionListaVacia;
}
